package com.itheima.chap04;

public class CodeBlockDemo {
    public static void main(String[] args) {
        System.out.println("num = " + CodeBlockBasicalKnowledge.num);
        // 在打印num时，在未调用的前提下却会先执行静态代码块
        // 结果：
           //静态代码块...
           //num = 100
        // 所以我们可以大胆地猜测，静态代码块是在类加载时执行（即在元空间内加载）
        // 验证：
        System.out.println("num = " + CodeBlockBasicalKnowledge.num);
        // 结果：
           // 静态代码块...
           //num = 100
           //num = 100
        // “静态代码块...”只会被执行一次，猜测正确

        System.out.println("====================================");
        CodeBlockBasicalKnowledge cb1 = new CodeBlockBasicalKnowledge();
        cb1.func();
        // 结果：
           // 构造代码块...
           //空参构造方法...
           //普通方法...
        // 所以我们可以知道：构造代码块会先执行，再执行构造方法，最后再执行普通方法

        System.out.println("====================================");
        CodeBlockBasicalKnowledge cb2 = new CodeBlockBasicalKnowledge();
        cb2.func();
        // 且构造代码块会随着对象的每一次创建多次执行

        // 所以，构造代码块的作用是普通的成员变量做一个处理和加工


        System.out.println("====================================");
        System.out.println(TrafficLight.RED.getLabel() + "下一个灯的颜色是" + TrafficLight.RED.getNextLight().getLabel());
        System.out.println(TrafficLight.GREEN.getLabel() + "下一个灯的颜色是" + TrafficLight.GREEN.getNextLight().getLabel());
        System.out.println(TrafficLight.YELLOW.getLabel() + "下一个灯的颜色是" + TrafficLight.YELLOW.getNextLight().getLabel());
        // 这种调用方法被称为链式调用法
    }
}
